<?php

/**
 * служебный класс для внутренних задач
 *
 * @author kingop
 */
class UtilityController extends CustomControllerAction {

    public function downloadAction() {
        $id = $this->getRequest()->getParam('id');
        $file = new DatabaseObject_TendersFiles($this->db);
        $file->load($id);
        $downfile = DatabaseObject_TendersFiles::GetUploadDirectory() . '/' . $file->filename;
        if (file_exists($downfile)) {
            // сбрасываем буфер вывода PHP, чтобы избежать переполнения памяти выделенной под скрипт
            // если этого не сделать файл будет читаться в память полностью!
            if (ob_get_level()) {
                ob_end_clean();
            }
            // заставляем браузер показать окно сохранения файла
            header('Content-Description: File Transfer');
            header('Content-Type: application/octet-stream');
            header('Content-Disposition: attachment; filename=' . basename($file->name));
            header('Content-Transfer-Encoding: binary');
            header('Expires: 0');
            header('Cache-Control: must-revalidate');
            header('Pragma: public');
            header('Content-Length: ' . filesize($downfile));
            // читаем файл и отправляем его пользователю
            readfile($downfile);
            exit;
        }
    }

    public function downloadrequestAction() {
        $id = $this->getRequest()->getParam('id');
        //$file = new DatabaseObject_RequestFiles($this->db);
        $file = DatabaseObject_RequestFiles::GetRequestsFiles($this->db, $id);
        foreach ($file as $val) {

            echo $downfile = DatabaseObject_RequestFiles::GetUploadDirectory() . '/' . $val->filename;


            if (file_exists($downfile)) {
                // сбрасываем буфер вывода PHP, чтобы избежать переполнения памяти выделенной под скрипт
                // если этого не сделать файл будет читаться в память полностью!
                if (ob_get_level()) {
                    ob_end_clean();
                }
                // заставляем браузер показать окно сохранения файла
                header('Content-Description: File Transfer');
                header('Content-Type: application/octet-stream');
                header('Content-Disposition: attachment; filename=' . basename($val->name));
                header('Content-Transfer-Encoding: binary');
                header('Expires: 0');
                header('Cache-Control: must-revalidate');
                header('Pragma: public');
                header('Content-Length: ' . filesize($downfile));
                // читаем файл и отправляем его пользователю
                readfile($downfile);
                exit;
            }
        }
    }

    public function downloadallAction() {
        $id = $this->getRequest()->getParam('id');
        $tender = new DatabaseObject_Tender($this->db);
        $tender->load($id);
        $file = DatabaseObject_TendersFiles::GetTenderFiles($this->db, $id);
        $zip_name = DatabaseObject_TendersFiles::GetUploadDirectory() . '/tmp/' . $tender->name . '.zip';
        $zip = new ZipArchive(); //Создаём объект для работы с ZIP-архивами
        $zip->open($zip_name, ZIPARCHIVE::CREATE); //Открываем (создаём) архив archive.zip
        foreach ($file as $val) {
            $downfile = DatabaseObject_TendersFiles::GetUploadDirectory() . '/' . $val->filename;
            $zip->addFile($downfile, $val->name); //Добавляем в архив файл 
        }

        $zip->close(); //Завершаем работу с архивом
        if (file_exists($zip_name)) {
            // сбрасываем буфер вывода PHP, чтобы избежать переполнения памяти выделенной под скрипт
            // если этого не сделать файл будет читаться в память полностью!
            if (ob_get_level()) {
                ob_end_clean();
            }
            // заставляем браузер показать окно сохранения файла
            header('Content-Description: File Transfer');
            header('Content-Type: application/octet-stream');
            header('Content-Disposition: attachment; filename=' . basename($zip_name));
            header('Content-Transfer-Encoding: binary');
            header('Expires: 0');
            header('Cache-Control: must-revalidate');
            header('Pragma: public');
            header('Content-Length: ' . filesize($zip_name));
            // читаем файл и отправляем его пользователю
            readfile($zip_name);
            unlink($zip_name);
            exit;
        }
    }

    public function captchaAction() {
        $session = new Zend_Session_Namespace('captcha');

        // проверим, есть ли уже фраза в сессии
        $phrase = null;
        if (isset($session->phrase) && strlen($session->phrase) > 0)
            $phrase = $session->phrase;

        $count = 5;
        $width = 120;
        $height = 60;
        $font_size_min = 32;
        $font_size_max = 32;
        $font_file = Zend_Registry::get('config')->paths->data . "/Comic_Sans_MS.ttf";
        $char_angle_min = -10;
        $char_angle_max = 10;
        $char_angle_shadow = 5;
        $char_align = 40;
        $start = 5;
        $interval = 16;
        $chars = "0123456789";
        $noise = 10;

        $image = imagecreatetruecolor($width, $height);

        $background_color = imagecolorallocate($image, 255, 255, 255);
        $font_color = imagecolorallocate($image, 32, 64, 96);

        imagefill($image, 0, 0, $background_color);

        $str = "";

        $num_chars = strlen($chars);
        for ($i = 0; $i < $count; $i++) {
            $char = $chars[rand(0, $num_chars - 1)];
            $font_size = rand($font_size_min, $font_size_max);
            $char_angle = rand($char_angle_min, $char_angle_max);
            imagettftext($image, $font_size, $char_angle, $start, $char_align, $font_color, $font_file, $char);
            imagettftext($image, $font_size, $char_angle + $char_angle_shadow * (rand(0, 1) * 2 - 1), $start, $char_align, $background_color, $font_file, $char);
            $start+=$interval;
            $str.=$char;
        }

        if ($noise) {
            for ($i = 0; $i < $width; $i++) {
                for ($j = 0; $j < $height; $j++) {
                    $rgb = imagecolorat($image, $i, $j);
                    $r = ($rgb >> 16) & 0xFF;
                    $g = ($rgb >> 8) & 0xFF;
                    $b = $rgb & 0xFF;
                    $k = rand(-$noise, $noise);
                    $rn = $r + 255 * $k / 100;
                    $gn = $g + 255 * $k / 100;
                    $bn = $b + 255 * $k / 100;
                    if ($rn < 0)
                        $rn = 0;
                    if ($gn < 0)
                        $gn = 0;
                    if ($bn < 0)
                        $bn = 0;
                    if ($rn > 255)
                        $rn = 255;
                    if ($gn > 255)
                        $gn = 255;
                    if ($bn > 255)
                        $bn = 255;
                    $color = imagecolorallocate($image, $rn, $gn, $bn);
                    imagesetpixel($image, $i, $j, $color);
                }
            }
        }

        // запишем фразу в сессию
        $session->phrase = $str;

        // отключим авторендеринг, так как нам нужно вывести изображение
        $this->_helper->viewRenderer->setNoRender();

        if (function_exists("imagepng")) {
            header("Content-type: image/png");
            imagepng($image);
        } elseif (function_exists("imagegif")) {
            header("Content-type: image/gif");
            imagegif($image);
        } elseif (function_exists("imagejpeg")) {
            header("Content-type: image/jpeg");
            imagejpeg($image);
        }
    }

    public function testAction() {
        echo "<pre>";
        print_r(DatabaseObject_User::GetUsers($this->db, array('where' => 'id in (' . DatabaseObject_UsersCats::GetUsersIdsByCat($this->db, 2) . ')')));
        echo "</pre>";
    }

    public function cronmailAction() {
        $tenders = DatabaseObject_Tender::GetTenders($this->db, array('where' => 'archive = 0 and end_date <= DATE_SUB(NOW(), INTERVAL 1 DAY)'));

        if (count($tenders) > 0) {

            // тут будет email-рассылка админам о тендерах, которые заканчиваются через сутки
            $emails = $this->configuration['admin_email'];

            $subject = $this->configuration['admin_email_expires_tenders_subject'];


            $tendersString = "<ul>";

            foreach ($tenders as $tender) {
                $tendersString .= "<li><a href='http://" . $_SERVER['SERVER_NAME'] . "/admin/tenders/edit/" . $tender->getId() . "'>" . $tender->name . "</a></li>";
            }

            $tendersString .= "</ul>";
            
            $text = preg_replace('/%tenders%/', $tendersString, $this->configuration['admin_email_expires_tenders_text']);
            
            /* Для отправки HTML-почты вы можете установить шапку Content-type. */
            $headers= "MIME-Version: 1.0\r\n";
            $headers .= "Content-type: text/html; charset=utf-8\r\n";

            /* дополнительные шапки */
            $headers .= "From: Герц. Тендерная площадка <administrator@tenders.gerc.dn.ua>\r\n";
            
            mail($emails, $subject, $text, $headers);
            
            $message = sprintf('Почта с уведомлением о тендерах, которые исткают в течении суток, отправлена администраторам');

            $this->writeLog($message);
        }
    }
    
      public function citiesAction() {
         $id = $this->getRequest()->getParam('id');
         $class = $this->getRequest()->getParam('clas');$name = $this->getRequest()->getParam('name');
         $cities = DatabaseObject_Cities::GetCities($this->db, $id);
         $text = '<select name="'.$name.'" id="'.$class.'" data-placeholder="Выбрать город" class="chosen-select_city" style="width:300px;" tabindex="4">';
         if ($class != 'form_city') $text .= '<option value="0">Все</option>';
         foreach ($cities as $city)
         {
             $text .= '<option value="'.$city->getId().'">'.$city->name.'</option>';
         }
         $text .= '</select>';
            echo $text;
            exit;
        
    }
    
    public function crontendersAction() {
        // отправим просроченные тендеры в архив
        $past_tenders = DatabaseObject_Tender::AutoArchive($this->db);
        
        // отправим письмо администраторам с уведомлением
        // об заархивированных тендерах
        
        if (count($past_tenders) > 0) {

            // тут будет email-рассылка админам о тендерах, которые заканчиваются через сутки
            $emails = $this->configuration['admin_email'];

            $subject = $this->configuration['admin_email_expired_tenders_subject'];


            $tendersString = "<ol>";
            
            foreach ($past_tenders as $tender) {
                $tendersString .= "<li><a href='http://" . $_SERVER['SERVER_NAME'] . "/admin/tenders/edit/" . $tender->getId() . "'>" . $tender->name . "</a></li>";
            }

            $tendersString .= "</ol>";
            
            $text = preg_replace('/%tenders%/', $tendersString, $this->configuration['admin_email_expired_tenders_text']);
            
            /* Для отправки HTML-почты вы можете установить шапку Content-type. */
            $headers= "MIME-Version: 1.0\r\n";
            $headers .= "Content-type: text/html; charset=utf-8\r\n";

            /* дополнительные шапки */
            $headers .= "From: Герц. Тендерная площадка <administrator@tenders.gerc.dn.ua>\r\n";
            
            mail($emails, $subject, $text, $headers);
            
            $message = sprintf('Почта с уведомлением о тендерах, которые истекли и автоматически отправились в архив, отправлена администраторам');

            $this->writeLog($message);
        }
    }
}

?>
